<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>ECMAScript基础之对象(深入)</title>
</head>
<body>
    <script>
        // this在不同的实例中，this指向实例化对象
        // 构造函数中的this怎么来的

        // 实例化与普通函数没什么区别
        function Car(color, brand){
            this.color = color;
            this.brand = brand;
        }

        var car = new Car('red', 'Mazda');

        console.log(car.color, '实例化函数');

        // 变形
        // function Car(color, brand){
        //     this = {
        //         color: color,
        //         brand: brand
        //     }
        //     return this;
        // }

        // 当new的时候，实际上只是在AO中创建了this对象，再将this对象返回

        // 相当于普通函数
        function Car1(color, brand){
            var obj = {
                color: color,
                brand: brand
            }

            return obj;
        }
        var car1 = Car1('red', 'Banzs');
        console.log(car1.color, '普通函数');

        // 如果返回原始值，则不收任何影响，
        // 如果返回引用值，则返回引用值，
        // function Car(){
        //     this.color = 'red',
        //     this.brand = 'Banz'

        //     return {}
        // }
        // new Car(); // {}

        // 包装类
        // 原始值没有自己的方法和属性
        var a = 123;
        a.len = 3;
        // 因为看到有属性len，系统自动包装类转换new Number(a)转换成数字对象
        // 但new Number(a).len = 3;没地方保存，因此delete obj.len，
        console.log(a.len); // undefined       
        
        var str = '123'; // ->转换成包装类new String(str)
        // 包装类里有length属性
        console.log(str.length)

        // var name = 'languiji';
        // name += 10;
        // var type = typeof(name);
        // if(type.length === 6){
        //     type.text = 'string';
        // }
        // console.log(type.text); // undefined

        // 如果想打印string，只需要修改一步：
        // var type = new String(typeof(name))

        function Test(a, b, c){
            var d = 1;
            this.b = b;
            this.a = a;
            this.c = c;

            function f(){
                d++;
                console.log(d);
            }

            this.g = f;

            // return this; // ->闭包
        }

        var test1 = new Test();
        test1.g();
        test1.g();
        var test2 = new Test();
        test2.g();

        // 阿里笔试
        var x = 1,
            y = z = 0;
        function add(n){
            return n = n + 3;
        }
        y = add(x);
        function add(n){
            return n = n + 1;
        }
        z = add(x);

        console.log(x, y, z);

        // 阿里笔试
        function foo(x){
            console.log(arguments);
            return x;
        }
        foo(1, 2, 3, 4, 5);

        function foo(x){
            console.log(arguments);
            return x;
        }
        (1,2,3,4,5); // 如果()为空，报错，()里有值，为表达式，表达式执行，函数不执行

        (function foo(x){
            console.log(arguments);
            return x;
        })(1, 2, 3, 4, 5)

        function b(x, y, a){

        }
    </script>
</body>
</html>